using System;
using System.Collections.Generic;
using System.Text;
using MbUnit.Framework;
using MbUnit.Framework.Reflection;
using PerfectPaperPasswords.Math;
using Mono.Math;
using System.Diagnostics;

namespace PerfectPaperPasswords.Tests
{
	[TestFixture]
	public class PppGeneratorTests
	{
		PppGenerator ppp;

		#region helper
		private void testKnownGood(BigInteger offset, string[] knownGood)
		{
			for (int i = 0; i < knownGood.Length; i++)
			{
				BigInteger passcodeNumber = offset + i;
				string expected = knownGood[i];
				string actual = ppp.GetPasscode(passcodeNumber);
				Assert.AreEqual(expected, actual, String.Format("Passcode {0} did not match!", passcodeNumber));
			}
		}
		#endregion //helper

		[SetUp]
		public void Setup()
		{
			byte[] key = pppHelper.GetSequenceKeyFromPassword("zombie");
			ppp = new PppGenerator(key);
		}

		[Test]
		public void HexStringSequenceKey()
		{
			//The default ppp instance is setup with a byte key so we 
			//should be able to create a new instance with a string then
			//compare the sequence keys
			string hexStringKey = PppConvert.ByteArrayToString(pppHelper.GetSequenceKeyFromPassword("zombie"));
			PppGenerator stringPpp = new PppGenerator(hexStringKey);
			Assert.AreEqual(hexStringKey, stringPpp.SequenceKeyHex, "Hex sequence key does not match what was given!");
			Assert.AreEqual(ppp.SequenceKey, stringPpp.SequenceKey, "Setting sequence key with a hex string did not appear to work!");			
		}

		[Test]
		public void PasscodesFirstThreePasscards()
		{
			string[] knownGood = { "8N=3", "7ucE", "aAg3", "zVv#", "y2Fm", "nGc8", "Vad=", "#V5p", "Y%vg", "JELf", "BjPq", "L@EL", "c6oL", "7hrp", "3iPN", "w8#F", "A2xz", "pNLc", "!XYs", "ZK#2", "yUjL", "q24z", "sp8Y", "#n8F", "nsZT", "DSh%", "#KXy", "4f?x", "p69J", "4a7T", "WTCd", "3z%G", "Dgf9", "AVJs", "v+FH", "eq4z", "yyVp", "5xCz", "?npa", "kiot", "zdJs", "6ixD", "ata=", "FbEP", "H27T", "F2yc", "%C@c", "H42C", "PqXm", "Cq=q", "Dea3", "BMGW", "ciqS", "M4c8", "eUWs", "mynN", "htST", "Aa8p", "Xb+U", "?2k:", "2+f2", "U?ZJ", "VfRC", "+o27", "5Ep=", "YoA3", "HySP", "bf=9", "V4yb", "d5dd", "nVCo", "MduF", "L#pN", "66j8", "upah", "9wCB", "aW3@", "6qEg", "RaX6", "y=#Z", "od3X", "vF3z", "uY+s", "Hs3g", "3Nxj", "vCdb", "RysH", "MW5r", "U8gC", "Lq?V", "Jjf!", "tTyE", "h7!T", "8aeR", "#UCi", "#SjN", "Cu86", "BcCN", "3xyz", "M@uR", "k9#W", "zWqy", "YKf#", "GfT@", "cP=K", "CNqo", "uXXs", "sGxj", "A3Bq", "R3rV", "cVMb", "fJfP", "hyGo", "c%+8", "@@=%", "fidu", "+gB:", "mRF4", "um%W", "AEBP", "J3+J", "seHp", "@KBs", "tz#?", "q#hj", "oSFS", "jBn6", "::uz", "!LZM", "oBaR", "3+Zs", "L+jK", "S#RV", "mWyy", "=GPn", "+6Nz", "i@e5", "Xiqo", "WKny", "!85C", "EMnC", "jjRN", "=mzT", "FjLp", "SnLs", "sz3y", "!A@U", "keHV", "j2!S", ":Bf9", "eb=M", ":S9g", "Pnr?", "HCob", "8Tgs", "X!:w", "Bqfe", "?oPm", "Mjb4", "48jt", "zLp9", "suuJ", "E!nY", "nPo3", "ko+:", "btz4", "J47H", "rsrp", "Mi?G", "!v@m", "tL5j", "vWf3", "@7#!", "CC%G", "coTx", "FNru", "#=%3", "G3Vu", "V9y6", "%NSr", "m?5j", "9ZBb", "AJhg", "UCN:", "dpa:", "GuWu", "tcmd", "L+7A", "@!NM", "C+cY", "aw+=", "y=4:", ":Fha", "z#pn", "miTC", "JthH", "PLGs", "yBLA", "YMkx", "Xh=m", ":B8M", "dNbq", "KAui", "rN3U", "XcY=", "GNVK", "S+P%", "mYP?", "ZfZ8", "SNEi" };

			BigInteger offset = BigInteger.Parse("0");
			testKnownGood(offset, knownGood);
		}

		[Test]
		public void Passcodes1024CounterBoundry()
		{
			BigInteger offset = BigInteger.Parse("1024");
			string[] knownGood = { "gir3", "k=SF", "Kg8z", "sZ:=", "%a#a", "uUwP", "PgUj", "i6W2", "iC?2", "RgW3", "LBJV", "JfK2", "R762", "tBi:", "rupc", "xU?r", "rt!6", "SGbV", "gGP6", "ExCh", "VvEs", "JA32", "Xv8Y", "ViMh", ":@JA", "KD6y", "vXeX", "wTU=", "B2h9", "#sgc", "2DS3", "dkho", "TBi8", "L99+", "fpnq", "Xstw", "m9Sm", "xCBU", "SeT%", "x@wr", "WvdY", "a@y%", "!r#i", "36m3", "jWYB", "2Har", "Ejpg", "%SYt", "gtwh", "eEot", "=xko", "XBVm", "5Yeu", "SybZ", "?pUN", "PnWi", "aL3i", "=tLt", "rpPU", "yf5T", "=PyR", "3pX@", "3w3h", "!hY=", "49Mv", "a6#K", "3Nw5", "aitm", "VBE:", "ch#@", "3Zf#", "38fU", "ivz!", "zufG", "z##=", "x?7#", "@zqf", "q+WC", "=ckK", "5uB%", "HH:M", "Dgmr", "=3R@", "H35k", "C6A=", "Pt7!", "mKfD", "M?s8", "XnJ5", "W=gS", "%sW3", "rfTb", "RRss", "go=5", "282a", "62n@", "ycdc", "nSwS", "D2mj", ":qGf", "2YRK", "?d76", ":P=z", "g5yN", "3k+h", "a?9j", "zio7", "C?VG", "um2Z", "om:y", "vbr#", ":nPe", "#T7a", "9DoP", "XDwe", "RLZR", "zabg", "@9xH", "oMDL", "F!4j", "vBU#", "fhf@", "!reM", "BtbZ", "RjuL", "E@sE", "FinR", "k7BL", "BVTy", "N+kx", "2Hvy", "6!bM", "arSo", "R8Mk", "@Mwe", "Kyps", "TsgF", "Cq#+", "=?au", "L%!y", "q+9p", "jgW9", "JBV%", "Y2YU", "KjqD", "%gu@", "+mB2", "oNPi", "YjEs", "@cSf", "3iF2", "prT%", "@e%6", "5MNg", "AC!i", "JmYY", "wS3!", "f%!s", "!m?i", "+z8%", "vHyy", "ht5p", "h73?", "WVcv", "ca8x", "LXr:", "SMX7", "o3oW", "ss9h", "vcXd", "4kzW", "r?X#", "tMux", "52hC", "zZD?", "R74w", "#@md", "SqXE", "VS=X", "RRr3", "Zv?e", "ySHk", "pkz!", "C4s:", "3u@J", "XzYG", "pPYh", "+p=i", "2!Do", "FAn3", "baYW", "%@BG", "f%pz", "2rry", "X!sG", "=HyW", "DDN@", "rDTi", "#DSq", "xkHJ", "b@Us", "vX3p", "JBYz", "rn4#", "iEWr", "BpDr", "w7x#", "XZ9j", "UAfd", "MC#L", "Mr@7", "oHiC", "6gM:", "5WMc", "mJoB", "@ge#", "?ozr", "k!%U", "Wfu5", "2B2y", "2=Cv", "ghH8", "JPaN", "#BxP", "sBpg", "PgVT", "2xzg", "dKNB", "T!iD", "MbRk", "Wncy", "xvb9", "jq#s", "LUK4", "%ivJ", "8UNX", "B7=F", "@+=z", "5sz4", "k9Hy", "aHMF", "NFxy", "L4YL", "JZ6q", ":59R", "o8Fp", "EgfS", "wRiA", "wP%9", "fieG", "f=2U", "J8qw", "xEKT", "nVgD", "K4!J", "WVRa", "eL9h", "#!hb", "Fjq@", "YS:v", "MdY9", "%emW", "9wea", "T4tE", "X2c@", "W?Bh", "t6cC", "3q6z", "g:CJ", "DWF:", "nKS4", "#wjs", "xydB", "2mKa", "XaRB", "Uz+7", "egTR", "+KUz", "LiiC", "Dq4@", "+C4L", "6Wbj", "Ym2i", "wME7", "ATeM", "dCwM", "TA2c", "Aais", "MD65", "DHz%", "RjDa", "pxK%", "pp!c", "5Gv#", "3MoJ", "PM4H", "6+%w", "v3:j", "4gWY", "W3BZ", "eGf+", "e3A2", "jSmY", "vR33", "JrsN", "5%s%", "94:4", "Dtk2", "aUTn", "zW!H", "Gk8g", "U%f%", "+?4s", "H4o6", "XUT@", "KZP!", "9E#n", "o:ET", "zyK5", "7mDc", "2pMX", "iFT6", "t7xs", "78#K", "2#VD", "o7xW", "AWCL", "qswA", "bJ:A", "sKZ%", "%DDv", "dh:X", "s7Sh", "%bHs", "Pn?K", "fha@", "8Knk", "Tf9e", "CXws", "y7UG", "f=53", "ovkN", "oSgg", "cszq", "v2AK", "yfYG", "dhi9", "eyEF", "fLMY", "fYtX", "jwnS", "K?KE", "NM=S", "KgJ%", "TzTs", "tyT4", "eva8", "Pn%k", "ngLB", "FGm3", "ntBt", "JFTo", "xLHU", "?:Y%", "v2tv", "7Mev", "d87B", "9qfZ", "L#DA", "AnRc", "VcEE", "D2o8", "bMgk", "C?c7", "m+=s", "j?J:", "Ndu8", "Gu%A", "hbqV", "jXRp", "+72x", "!W@x", "LcA9", "s7VS", "Fker", "Zqcm", "p+=k", "fre+", "vwLf", "cT8D", "Miuy", "n##m", "CxJN", "%Ee+", "D#?M", "d3LF", "fcN2", "iCtD", "3y=N", "#iJb", "a89T", "BVWX", "FhJp", "GLp7", "uTGq", "WPgF", "+Rrc", "SbJ5", "s4V+", "n=A3", "Uo:s", "H:gD", "3NLB", "ZJvZ", "L7a:", "ZSbr", "SWCV", "59AM", "Z@As", "a3Hf", "jxvj", "@JdK", "BFDW", "MDyn", "!wk8", "::ax", "NvWj", "mkUw", "yU!B", "4i:F", "A#LP", "uL+K", "TCAV", "GgUR", "GNV+", "d?XG", "jKqX", "c@dV", "qp:C", "d=2M", "grXH", "rY4u", "rNB:", "t+D@", "xGRk", "auhH", "FSGw", "naKv", "gN8r", "cnRE", "Cyxq", "VoHx", "f3d@", "KLfo", "z#Vp", "KyHR", "zpGq", "wP2E", "LqF4", "Zvxb", "CPkT", "Y?me", ":ar3", "pmf%", "g%sf", "pZfM", "8dwS", "6UE+", "PqCq", "txjd", "8i2N", "ixxT", "KANJ", "Hgjf", "C4fM", "yMbq", "w=kb", "Ygvb", "Zp=i", "VmJS", "3UZ!", "u4eN", "#Rv4", "PTqp", "BNE8", "M!AK", "+jRc", "#5c8", "HWr+", "BdfD", "?%Cx", "JfK9", "@2M=", "9qZ9", "?h4g", "Yeaa", "y66p", "X78U", "8fiL", "jV3L", "xDH%", "M:WE", "YvF4", "NRhe", "SFvT", "9nZT", "b3L?", "c4m2", "85sm", "eTV5", "yn9L", "Zgvg", "gRUR", "w@nv", "R!Rs", "Z2SZ", "#wg%", "fdEn", "ovRC", "VHX2", "Rz@E", "2rLt", "iT3r", "#K+N", "?:SM", "7wAX", "f2hx", "P:c?", "?hLX", "Hp83", "YMPM", "UEXe", "+YH8", "Mtfp", "@#Rx", "YUq=", "TzpB", "MhWz", "N759", "B#zt", "?!xf", "@@2U", "7rqu", "jTHX", "qioo", "cZ:S", "hVgV", "nj6Y", "fKm!", "iac+", "xLoK", "FctB", "wE+d", "=oi5", "bUco", "RRKA", "fgfb", "T:%q", "B4ai", "T?d6", "y%P#", "bSgM", "xw!%", "b5tY", "3e86", "ya!6", "eEpm", "qSxw", "Mg=d", "S4t9", "gRW4", "MyTZ", "cT?C", "xewK", "f!Mu", "cSJw", "qyML", "2ckc", "62RX", "SeUt", "eVMf", "PkqM", "FhMY", "!nSg", "vVrY", "H4Ab", "Rwz4", "AbfL", "y!YH", "s6D%", "kVoa", "zw9R", "zAoS", "4eAC", "@y+E", "geEb", "zuFJ", "%TgE", "XdCb", "bw7A", "#mjh", "4+4w", "rnUb", "CJWe", "sVGg", "Xc=M", "8BYV", "v5LU", "4tYA", "=Jft", "4Ls2", "69To", "beou", "AqYY", "PTVX", "@v8c", "24Ef", "nNFU", ":eSS", "gWrk", "wU35", "8qpA", "nfsh", "Z=ao", "KWUU", "HB?R", "khWy", "vuwV", "=jH=", "=iep", "49=K", "RK?@", "g5EA", "3?5P", "?JAM", "S#Kp", "7BJ9", "9@RK", "TGYo", "e+Dh", "wRT4", "kZvd", "Ni=X", "7YJq", "=KqU", "3=iu", "cX@2", "xnmT", "gSE#", "c#3r", "nv7o", "zUwJ", "%hSo", "BSjG", "UuS7", "HFgj", "#zVi", "X33J", "#SAu", "NivH", "L+r:", "A2AL", "+38b", "2NrM", "y3g?", "zSeo", "i6ss", "Zfmi", "xav5", "YWm9", "Xv#H", "K7tV", "ozAp", ":e4z", "f2p?", "wG:T", "?##i", "kZPK", "SkJx", "Xm+f", "TnM#", "8vV7", "Bj+7", "j8iu", "=9?n", "rLrP", "UWT7", "3Ygq", "U2Wp", "+MrD", "x#yj", "bKM4", "xa7!", "Gytq", "9Ad?", "Zwyz", "@SBW", "bid2", "y7Aj", "?KyE", "uBdt", "S@4G", "m@:8", "@T3m", "88Lq", "eTe5", "qqrk", "Miuo", "z4zh", "tgir", "@+%E", "5Dvt", "nUvD", "Sb=v", "KVs9", "DfFV", "rnFJ", "FRv4", "o@B@", "29NR", "qTLL", "XDag", "ryKe", "T5GF", "exoi", "=xFw", "dc78", "ctEE", "afZA", "Wmc2", "HJ28", "zXuE", ":3WH", "+5Zz", "Sm:w", "q5LD", "rn@v", "wjn%", "f@ih", "UkAb", "nqMe", "ewCt", "NSXo", "C?re", "%Hsc", "Kikf", "H?M%", "DKxU", "+iv?", "YUte", "ZkV%", "rjd9", "SMst", "Lrt?", "tiBp", "pp6f", "KM%R", "6K%g", "q#k7", "DjyN", "YUf=", "aH+o", "2WF2", "WHk8", "D%g#", "PaxU", "nR%t", "d7rW", "U!%w", "VWcH", "#?5w", "N8dP", "Z3U8", "rx3C", "?yb?", "v++n", "?qJj", "6Cco", "?c4M", "mbv:", "EBJP", "ALap", "4z#:", "c+sL", "fUiq", "fKs!", "3x4h", "w6w?", "k?T#", "Pq+n", "GsSW", "+N28", "E3Yv", "m@o=", "cgWJ", "46v@", "U:6U", "y96b", "CNhV", "NvAy", "T2%y", "wLZR", "X9gx", "B6e4", "H2BE", "D!@d", ":Wht", "#S?b", "7jUe", "cv4M", "i52Y", "xYwY", "%dir", "8%SZ", "x!xc", "EKeD", "aoxz", "=oy9", ":T!5", "nd2K", "EwDf", "jN@w", "UPUy", "UHgU", "ykvx", "5pLX", "CvpJ", "55eD", "J=tc", "KmTF", "#WTh", "xgz@", "N%EX", "Br%m", "cWJq", "9S6:", "virB", "K!6F", "7uX!", "AoAy", "nNJV", "ktHH", "6BtU", "e8sX", "H!98", "wP!J", "R2LK", "nyHd", "v5Rq", "T@ch", "AggK", "KFpC", "rALD", "Gtmz", "NV5N", "KvXM", "5BNb", "s6FH", "t6zb", "LgTt", "kX6h", "asJS", "t+?M", "MUMv", "Ut3=", "ajK6", "i!zq", "?#RB", "Wcj=", "=K!P", "PKZi", "yCDP", "E+Kt", "26U%", "tfJy", "!9Y2", "J3N:", "@#uJ", "CcCK", "ABy:", "PxLk", "NDkK", "LtJ#", "i?3A", "92Ha", "rmTy", "hMFm", "cnsk", "eNyA", "oHha", "si4K", "nGJ7", "xoqx", "+a8E", "ohDk", "?kV#", "vfyt", "SqST", "d7BL", "+#t:", "Lt2%", "Nw!i", "Ab%%", "9ZE%", "e+n5", "XEJm", "AFph", "ykq3", "7Y6X", "eBY%", "9+WV", "MKn3", "ivvD", "J6j+", "msvk", "NsZ6", "8k4d", "6cqj", "oomx", "@b3W", "zPRe", "D4hX", "4!GM", "q+GA", "H?of", "SpGg", "gr@U", "pr#9", "#paN", "wc9!", "dcqk", "tndh", "iWVU", "@uqn", "xo!e", "amCb", "FEwS", "eUcH", "CXrk", "GYnb", "oSSX", ":VPe", "zGSW", "mYSU", "SCqG", "cf6g", "nFL+", "3fcH", "FA+V", "4z4w", "V?Se", "ibpH", "3gtJ", "+XoG", "oSfG", "HHYV", "qAqF", "w=8N", "jRP6", "HP@y", "Ng9e", "ZNF@", "@a3C", "rYjF", "ifj@", "9Ycr", "DSwo", "pRfo", "F2fd", "aJes", "Gs?3", "RKb6", "A@?r", "9Mbz", "zXmz", "7hqD", "fPAn", "N?dD", "3jM5", "=LT+", "dBGA", "s9Jg", "SDJX", "mAb7", "My4K", "V@7S", "SHRN", "J8x2", "HK9D", "xUU5", "6edh", "s#Nd", "HnPG", "fg=:", "%wmF", "VscL", "qj@F", "ceVz", "Afm%", "GkVC", "+Fib", "pF8s", "TZ2J", "abvd", "VShr", "=3g@", "qrE%", "6hYV", "xZY=", "Nmze", ":Kko", "mPUP", "#!%?", "9zzk", "e+Zt", "Ry+y", "gn2%", "eV4o", "5Tyy", "+:N!", "KoKS", "gF7D", "GBJS", "XkS6" };
			testKnownGood(offset, knownGood);
		}

		[Test]
		public void Passcodes32BitCounterValue()
		{
			//Random 32 bit value aligned in 16 byte window = 3167792480
			BigInteger offset = BigInteger.Parse("3167792480");
			string[] knownGood = { "4gqL", "Uzo=", "9q2%", "bC5n", "Zki2", "u4pD", "Pipd", "B9Ps", "dDfP", "wak!", "=k@:", "6%dP", "R=aW", "izpV", "Bgv@", "kzUP", "KBvs", "%F9q", "yMia", "xijw", "vh:w", "erVR", "tog2", "#Bf8", "FY9Z", "!=nT", "Ubjn", "W:?N", "RY@8", "Put=", "#?s9", "cHon", "idhT", "F5Wm", "Lp!r", "zppc", "XKsK", "5gPT", "83qh", "Hz2A", "NV@U", "4SPN", "RDH9", "Dwh=", "q4LY", "+4VG", "2Ty4", "USUV", "CwCu", "Cf@o", "xfXv", "wk5f", "V58L", "x5Ux", "T:zR", "b:A6", "Unmp", "?9Ma", "7Dgk", "Sqq4", "An9f", "Eh6g", "J7Fn", "zu!K", "9D=L", "%NTs", "t=Wh", "#@aT", "E4Ks", "B@P9", "pTcB", "?cm%", "GVWz", "35Gz", "Y:9:", "nmpc", "rgxE", "dBaV", "72bx", "q6yp", "!AJX", "jogH", "jha9", "JSR:", "dKy2", "Kh:S", "qfnb", "ZDye", "35Su", "spi!", "a5%z", "vuTn", "tsg?", "j@eX", "vtXi", "h=M+", "iuXT", "UmMU", "a3br", "pXVR", "T6?M", "LyYU", "vG4S", "Cf9A", "Wzgi", "fAeH", "=!Zc", ":k9A", "@+=k", "3=kZ", "6GuY", "EaKw", "i8Le", "EVTC", "Rf:@", "!XUH", "oJyB", "?f#K", "f2Yw", "Y#@K", "V+wD", "gSAg", "qsYS", "3HYd", "vrF=", "gLSk", "CnJ!", "t38o", "H+TC", ":n5F", "CzmC", "u!p=", "@WhF", "Zwuq", "V=KX", "tTTM", "FdWU", "%fzg", "yBho", "o4@%", "SUTt", "!@UT", "pUo%", "=9Jp", "Fckq", "s3d5", "3rrD", "feoZ", "R@Rj", "Mfa5", "EP3+", "mu7T", "9hM4", "sCKC", "w:=e", "ifN=", "HciM", "jEhu", "f7ZP", "sT6q", "q+3a", "Le2o", ":mgj", "mPVG", "vc9i", "Zcy8", "Y?dF", "+Twb", "?%PC", "E9sW", "CTik", "3?AG", "6Npn", "2VLA", "6AqY", "jFpm", "pYJR", "U5tg", "L@Rv", "@=bp", ":8Sy", "A94o", "YXdK", "feNe", "GSmh", "vEyZ", "jU?Z", "BxrP", "EY2h", "6JE#", "Zw#M", "Ddb2", "mGVa", "rL7M", "vHkn", "zD!W", "JSzk", "4@Z3", "MCRB", "bs:Y", "V?uK", "=gnn", "g7fW", "ATBG", "7EY@", "u3f4", "Fjjn", "42At", "t@vy", "qV=m", "EnD7", "9X6k", "u%Xv", "45+M", "2EBr", "bES9", "zq95", "y9Ng", "d:ho", "MWEg", "ifd4", "+k@F", "bzG2", "7y7f", "6D:n", "m@wz", "YHoD", "GD7N", "U+v!", "en@z", "%i?5", "ynxP", "gYNT", "EB4c", "o75V", "YddB", "S8#q", "Mgx=", "7vTZ", "nmoz", "Kr+b", "@27X", "Hv!K", "kj+R", "t58D", "#rvh", "nSCN", "95FA", "wALH", "u?yb", "AUVH", "MjBR", "gEg!", "oFyM", "o:C?", "9pkb", "=RK%", "fSpd", "dxGY", "A=@g", "knaZ", "AHUU", "pGCT", "bPgV", "uKsZ", "aYc!", "nPAq", "%Vg%", "p%ym", "PH83", "Xav7", "4PAJ", "Ra#a", "Y+Rq", "zUhe", "uJ2=", "@Uaz", "U5cg", "dKZ8", "#3@=", "!U:n", "sjqT", "qME4", "To8e", "yNfb", "TcP:", "!y+q", "nD7Z", "qf3%", "HRbJ", "Esht", "HYpG", "5NEW", "pCkj", "=Pu@", "HCGi", "?oxb", "f3w!", "Sas4", "C?rr", "xEXm", "oaJN", "w?Rz", "BkPv", "Edn%", "Pim2", "F+PM", "JYju", "N6XT", "hxor", "U5G4", "5#m5", "5nmT", "m?RD", "o5f=", "L:L6", "z4KH", "V@Wt", "LWrb", "vc5E", "kFYi", "JqbA", "vTqd", "RJKX", "n5YX", "cC83", "qJaM", "R#p8", "%U@N", "t6SJ", "XnUu", "D@6M", "3Bt2", "E5ot", "qVMi", "YJ+w", "B3ED", "=Aoz", "8+5M", ":fBa", "2Nv9", "FUb:", "La4f", "DR?+", "i8=8", "Ms+M", "d:qS", "eMWW", "ybq@", "iyM8", "2fb%", "Z5Cw", "!xw=", "nT:W", "BJBH", "qZTN", "qFbF", "!tXd", "au?2", "23BS", "iV9M", "A5YU", "FUfP", "Eah4", "jKRp", "zm#T", "FpcM", "+SKT", "Zmk2", "CT:h", "D%Rc", "HFR3", "WEWj", "?=dR", "vTh6", "sh7r", "+kCq", "fdTk", "fzJb", "UBU5", "6RPR", "UGE4", "n7se", "u@NM", "e%e:", "bm4!", "TCJT", "@uiT", "=!VG", "@Men", "RSq?", "C2:x", "%oCw", "j=5#", "2=jh", "jGsb", "wab8", "uTUV", "VVSv", "3ry=", "e2@i", "S7yX", "#cX!", "y6Y?", "s+db", "YPcV", "w6Z:", "WsHc", "GTP@", "uZGV", "jMf7", "ChHT", "iBXH", "BqoL", "MiPF", "iVoz", "Vb%J", "bPeB", "azi%", "5vNw", "dGDm", "qtkR", "RzY=", "TB+R", "BF8o", "x@YS", "AmfL", "8nxk", "zDyV", "5eer", "rSvB", "Tvku", "YHvB", "5#En", "@yts", "V:+e", "#++8", "SmMF", "rg#m", "hMvC", "tDhx", "FGDY", "fn?i", "f83r", "jk4D", "9Jka", "%93h", "TdhF", "4C!+", "t96U", "6bsh", "NSW5", "RKmR", "%b=v", "23hJ", "D7k#", "d3!L", "Vb3f", "@%wp", "sM4C", "f?E+", "bma2", "jZcz", "5+kN", "zi8T", "ukvD", "scUN", "%!6a", "oR%M", "DboH", "n4Ed", "%vF+", "2fin", "M3rg", "m!+k", "H8Kg", "=KUd", "!ac%", "YZ4v", "C!=%", "u6+y", "xuW!", "bwu:", "qe!r", "pa=c", "HXAM", "x4xq", "rgT@", "vH5R", "t85#", "VToh", "NZk4", "Yt+2", "DTq5", "Wkhb", "7GsW", "3Yxr", "VD5#", "5faf", "iBdF", "C6Lg", "P+RA", "3Gy:", "w%Ur", "v5jc", "Ai8@", "ee#c", "m%iG", "Y#j4", "yVze", "P7Cb", "UTpG", "t=sS", "xtJM", "APWJ", "sbUn", "SZDs", "N=Sh", "VzVX", "uZa7", "No@L", "a5Hz", "S@Bb", "cwWV", "kt%+", "C7HT", "b!4+", "7b7:", "WXac", "PYyU", "rn:B", "9PoU", "p74E", "L!=d", "q9gF", "Bu8t", "6bGr", "grwL", ":oh@", "#PtB", "HqCx", "Pbdf", "oGKb", "HjkW", "G3CM", "98nN", "R2ca", "XbXw", "%:%9", "cd67", "RuXe", "qvL2", "cbxz", "%9kX", "AA@Z", "MYa6", "#T25", "3i2M", "autU", "ic#b", "@MM=", "YhY:", "%xU2", "o@A6", "hDRc", "htU%", "yP8v", "oVZ2", "2cpM", "GmN3", "UwTd", "yL+M", "M2Rx", "vxA=", "x%63", "oLW%", "WxWU", "wz!9", "JcgG", "aWUV", "WC7g", "ipKM", "Xy8u", "fDuf", "2Jwi", ":CN@", "ceMD", "=AZ@", "BUSL", "sCch", "5csC", "BFj8", "UUKz", "v8=p", "CJ#M", "yDr2", "ssfm", "Fkhq", "G4%d", "mESK", "sHtN", ":bpV", "Cokk", "8oAV", "f@:G", "%Wri", ":KLw", "gpC6", "45=t", "pcgG", "bGRH", "bcuM", "g6:r", "U86b", "U3%x", "Nz4B", "adD4", "6hJL", "fo@S", "K3pC", "hXND", "to5V", "MCP#", "MMky", "wCke", "qNj7", "p#Fh", "Tzn+", "kGPH", "#af=", "JS4m", "Dv+L", "oS@F", "T!NM", "g@rv", "YigE", "ZNoa", "B?Ej", "w%h=", "sE+V", "bv4n", "PfYe", "R5iU", "E!Ff", "2Txe", "nW?N", ":8ZS", "i=q=", "Ma8#", "UftH", "5#Ls", "ykNu", "3ZY@", "oLwK", "Y7R!", "Uq+?", "W8B6", "W=+6", "W+!#", "@JDp", "x4ec", "4PBi", "srD:", "zWe@", "YzJv", "gRxy", "5D!d", "ADWV", "VRW:", "yyP7", "t7@y", "5mM9", "+qbV", "v2k8", "4aFz", "e#hW", "!:H?", "qiWw", "gSdC", "xg%+", "SRrb", "?WaB", "3sxk", "!?h6", "dK6w", "+EqZ", "R!5#", "zmXw", "UAGt", "stCw", "q7A=", "AAHM", ":PJ%", "ZgkL", "pBLr", "cVx+", "g2%B", "goKx", "m%:Y", "uZoG", "EChS", "MtCN", "uhAU", "kC=j", "?CFi", "H54:", "+8%J", "x5Ys", "XYtf", "u4zD", "U:Zn", "mHL:", "xSRn", "yKum", "!5ma", "=8Ut", ":D7D", "7T:W", "LMtt", "Sw:P", "bA#v", "8kVX", "ywe7", "LzR8", "aGpH", "y%sd", "cw??", "UDoA", "G+ur", "dN4F", "X+wL", "FG#g", "sUay", "obm9", "Nz9d", "@!6!", "ZcjY", "JNG3", "G@YV", "6=Py", "::Nc", "NkP8", "wN6Z", "jAhT", "c!4R", "XB3+", "Rqv#", "noSR", "3rkD", "SVUz", "+=Sb", "yhAh", "7P63", "gSAy", "?gfX", "HJ7f", "%zN?", "y3G3", ":6rS", "ys:d", "np9C", "6b@:", "TPgB", "AG!A", "xjuw", "3j7f", "KpsY", "Lni9", "?2et", "xjYx", "AS@P", "T2s2", "Ha6+", "MZU#", "@T!H", "rvou", ":nGN", "Rpbu", "We+W", "rr:U", "?kDg", "i4Un", "anLG", "7vJw", "8cbW", "M3Re", "!@sG", "?xme", "HpXx", "=MAW", "K8t#", "Z?es", "GpBA", "mfsC", "j8=e", "GxSs", "gJxw", "kidy", "@AKL", "%ZaX", "j6qi", "3Vhn", "D?pR", "EGhM", "RAW=", "J5GE", "p:Nn", "6u5y", "Y2Gz", "w7!k", "VmSF", "A:hJ", "hv!3", "oFBb", "j?M+", "Rrpy", "VJb!", "okRK", "5#qm", "dZHr", "7g+j", "iub!", "anF%", "sGNR", "!+MP", "o4i%", "3VRY", "Cnd@", "7JEV", "dHC7", "5VkW", "Zu?e", "j9JL", "85nS", "UkZs", "tqeu", "Me7f", "kGBB", "V3GV", "rTF2", "t=ze", "Px%3", "?4mW", "Dk@d", "mkLt", "Dprr", "t!R#", "Xz#2", "gnCD", "@Enz", "?aAz", "3Tvi", "7Krr", "B7nn", "i3qU", "f9BS", "u@7@", "r7m:", "gbzr", "#+sq", "?tz6", "CBe#", "YSb5", "xk84", "E6@u", "uYHR", "zE2m", "a?Yg", "3wvt", "a=sf", "6?TE", "5@7u", "D#DG", "%4z6", "yTu+", "AY99", "qWyF", "DiTh", "wbn9", "#G:u", "wCn8", "Y4ZV", "=bYz", "srN@", "9Hy=", "sCSa", "skdE", "wgVv", "Gy8+", "r97c", "Gdao", "Lr=:", "JK?f", "?ejw", "PG6V", "Vav:", "SXn+", "VuTp", "9!yW", "LBo3", "9c3t", "HBMA", "m7%x", "3gzT", "Ew4h", "sWzA", "oAEN", "Jj=c", "9B7t", "oHsV", "?VDJ", "J3sA", "BWs3", "i72S", "WsP2", "GirX", "7NrV", "WSav", "wkeX", "9stD", "#M?U", "DtXi", "n+!=", "fSW2", "!v7v", "B2wM", "@VLf", "@G#=", "q2V:", "bgp8", "KoNs", "q:qb", "PLg9", "Rxnd", "xX9g", "4h3i", "ja==", "c!#J", "gRPB", "F@Lf", "zVSV", "JCR:", "KroL", "5cP%", "ya%Z", "v2Zb", "8Epq", "Pc%2", "iWzZ", "jdAN", "outy", "h86P", "%UZ:", "SP?s", "vLTc", "X3Pi", "cm:4", "J2+j", "pMdS", "oGy8", "BNnp", "Ha7c", "t2Kf", "LNX?", "%uh5", "!!+c", "i+xw", "@umB", "cDGc", "iMpA", "uzC9", "xqEe", "Uhxb", "m7+i", "iAAK", "7BNm", "saUt", "Ttf=", "WEa7", "6D:#", "KbAg", "xeYu", "b!6E", "xJ8X", "c8Ab", "Ym!H", "hc45", "NMPp", "B7XT", "C58p", "Dr!Z", "pX?j", "4c%9", "bjx9", "g2SP", "odGb", "#eZF", "icqH", "LtFf", "8!a+", "YVVY", "ptuS", "XcMx", "YUmC", "vDn%", "H96F", "!XdH", "8#?d", "87qR", "2auS", "sr6%", "sVAE", "M9Gu", "sr:E", "cyLM", "fu5w", "eD=Y", "nweV", "42aD", "4F=P", "yN!i", "nECh", "%du9", "sRSc" };
			testKnownGood(offset, knownGood);
		}

		[Test]
		public void Passcodes64BitCounterValue()
		{
			//Random 64 bit value aligned in 16 byte window = 9973470724030316624
			BigInteger offset = BigInteger.Parse("9973470724030316624");
			string[] knownGood = { "ZgSP", "PEqd", "J5P=", "v2JE", "Xy8c", "w:c7", "Zsxv", "!saF", "9An?", "DdUu", "qLod", "xqSW", "KtXZ", "+Fii", "cxpz", "YT4X", "o+zt", "%nHd", "mTDa", "5vSB", "nRCW", "UbAi", "ey9Z", "Tgde", "mU!+", "3uzM", "fpPF", "2hr9", "NGvt", "MYSD", "#TP@", "chKu", "stwn", "X#@C", "NB6c", "TPXu", "6:N:", "=ibJ", "gtjH", "X+NR", "VXjx", "s!%7", "k5dZ", "PRxR", "WCTC", "c8!t", "?yKh", "44+=", "yAvL", "FeZb", "HC2D", "?@%U", "A@rT", "kgKo", "M8GL", "amw:", "?niL", "trU#", "pNyM", "xrDP", "R5eP", "2XYF", "NyxD", "bWk#", "XPZ3", "cm47", "Hp%c", "V:ir", "8s+P", "%sN%", "Xs!:", "akv8", "YDA#", "a+U8", "jmZ:", "v6s4", "!sHM", "?2Ax", "7xvK", "hKy+", "UwXE", "i!Tz", "NShc", "tDgE", "G=6g", "mo6%", "o%2z", "89Jh", "d+D2", "S2UU", "Xa?d", "gS!j", "xhAw", "k?No", "SfUy", "M:hJ", "kzW9", "3fbE", "v5MN", "Ji8x", "djg:", "B22d", "VjCM", "tzJv", "UAbF", "ovrU", "tKtd", "5KZB", "Knmj", "K8AL", "qMNd", "#Swi", "A7+V", "H8VC", "8u#P", "%FsF", "Ck25", "iUbp", "9g?g", "tgU!", "hD55", "Mpo4", "Cpkz", "RA9h", "42vH", "v=fr", "uNNz", "6hBe", "nj3g", "cYgy", "nNBZ", "vm94", "LRTB", "=gwB", "ofzb", "YTvP", "pM8D", "p?Sn", "r76+", "Bz:n", "@t?4", "gwH=", "hi9J", "rp#o", "w@xJ", "9kka", "?KkV", "ow4E", "4m#y", "P5mc", "u@7y", "6iTp", "Y8%!", "iTu@", "mwLv", "rxPR", "JYJW", "eF!?", "XmTq", "87Sf", "q%Yr", "FG5F", "983%", "igTD", "T#zX", "7oU=", "4a%U", "JraA", "5cLz", "+CsM", "YUeH", "Ej2Z", "#S%3", "sqJA", "2wdM", "xL!j", "BMqB", "UqoU", "qUMj", "VdLF", "fY6S", "cMC7", "YWqm", "CWX8", "tBv9", "7B?2", "9Sh5", "piv3", "uXxB", "G8w2", "chLL", "##SH", "AV6U", "qm9?", "wABC", "Pjfn", "8uEa", "AFrY", "fEb2", "kkN3", "sEVV", "H!:i", "qbBK", "rScF", "6sE7", "yMBV", "7CcY", "9zds", "2mpM", "kw5s", "9VL7", "yNXS", "Z4ey", "Ps:m", "9wsz", "uHCF", "CUi5", "%WHm", "tAdP", "4rFS", "oGnR", "ivh7", "B4eB", "c4ja", "8GV8", "yF2j", "rfGp", "!6H5", "n5TJ", "3:tv", "igs!", "8JB9", "aJKi", "niqy", "gXfD", "hnm+", "x#Hq", "=MKA", "Zx%R", "aewB", "NVEF", "D9UM", "WMdR", "9R#e", "WPgd", "R@%Z", "ccev", "znFU", "Uwr6", "@4qA", "mz6Z", "q7AV", "jVyh", "fS98", "@go7", "KPPP", "4ZF2", "N#Kn", "5jCg", "KHX#", "Et5:", "TtnT", "wh6S", "e6qU", "3VXA", "@4Ny", "8cfv", "Wuiq", "=PzY", "G9Cq", "yHMN", "XEq7", "qyk2", "3zXp", "f85A", "sDX!", "WEkB", "WpYP", "kG#a", ":LK4", "@heL", "8rh2", "zRn5", "egao", "2w5w", "66Ta", "8Nm:", "eiWh", "SVEm", "i=rA", "TxL4", "A#gB", "@Uhu", "s!d5", "3PF9", "vyN6", "Vnpp", "r4RM", "o%NA", "6xrL", "W#oo", "2VHc", "?kUz", "B=Sa", "UUDs", "hVPG", "f88=", "Ui?f", "Vfgr", "nL9d", "%zv:", "Z583", "HFKB", "=CPR", "Zzeb", "Sp?B", "d4rz", "eTa!", "gmz9", "79TB", "npB3", "4n!Y", "WF!%", "9H!M", "%mbp", "gUjX", "ZeXB", "%AZv", "f8rG", "Vhcs", "J:xH", "9#jh", "6S8u", "T%gs", "%qFT", "h%zt", "6sif", "gUjz", "Fwi:", "ebsy", "+EWe", "86oc", "ciEg", "XNdz", "DgFb", "qbDv", "4Wk9", "wRrq", "e@RL", "3oW3", "gKC#", "kcX:", "eo#%", "2@%L", "p6EW", ":s3e", "+Rcn", "abN#", "SqrC", "P8Y7", "3xjg", "qCYo", "Djpf", "zYN2", "24:#", "v3Dr", "FRuP", "AKNZ", "gyi!", "m:X8", "NWG%", "vC4t", "m=Yd", "m2wp", "Jw3C", "vb:M", "#gv2", "n?Bx", "cnm7", "u2CX", "CtvP", "RBa#", "x7rs", "@Xh?", "dgKi", "wyAJ", ":?8N", "BH=y", "8Dyp", "4oLJ", "+MHg", "to!q", "cV=D", "n2aV", "+:8B", "qG88", "ZNrm", "L+tX", "Z9pT", "9o4J", "GFSr", "+boS", "Gxo@", "WPGg", "jpdB", "ZY=L", "2rrw", "=n:A", "a=:H", "uLre", "8Eds", "vqTM", "K@3E", "PC9?", "mFp4", "+6TZ", "V!yq", "HFP6", "cx@:", "h7b8", "rUg@", "E2op", "!!Cp", "5Pze", "rcBU", "7evC", "z=L#", "2MHK", "Djp%", "EhTL", "vDXo", "po:a", "!5yu", "+8ya", "Jz8@", "a22P", "B4qp", "vd!9", "hjxU", "nFN9", "v6+x", "Axjy", "d6Mp", "A6Rt", "ULxp", "NzPP", "fDp:", "%hkw", "hay+", "HpeK", "kvAk", "r+aX", "b7Mb", "jpBY", "4BRL", "3%3J", "AEq4", "Wp8%", "%SYz", "ZTG3", "g5xY", "Ju+V", "JuRg", "##Xz", "Cjvq", "?LwL", "Ppxp", "vm?C", "kc#V", "e447", "NP=i", "c=LF", "KLDd", "VSej", "3She", "oC?@", "GokY", "7zvK", "p!4K", "S+9L", "KiiF", "5Wcc", "hegN", "N?dv", "ZU4+", "ddpj", "d:F?", "%Nft", "f2dG", "aw4X", "jt@c", "X:tB", "3t4G", "RTM4", "mcTU", "wL@d", "Zemu", "iZ:=", "MW+k", "Z@jR", "VXi@", "f28@", "o!A:", "fd5j", "Z+a!", "@Y!t", "rjjv", "FqZY", "%W@j", "xMuC", "YNb?", "BZLg", "uK8%", "%JXL", "dSW@", "ixW4", "jy+W", "T2X!", "wq?p", "DXc8", "o9qU", "LyFP", "kXU#", "Zg:d", "9U:F", "vGSA", "#9hC", "AAbv", "ANg2", "n4WW", ":?6N", "!gF2", "+u5u", "qEJ9", "NS7M", "sPM=", "u#HP", "K!gB", "As=+", "sKV3", "8D+P", "3385", "fW96", "C3J?", "%iMd", "DUhc", "c6cK", "g9xf", "LFJ+", "yzC7", "xpn#", "E62z", "g6H7", "xtNL", "UY%h", "6vfz", "6@nJ", "FHMr", "nN8%", "q=:H", "Wjap", "jnAG", "UV3C", "k8Rn", "bEZU", "fp9S", "PE%q", "FEur", "L8Uz", "45SM", "cnLb", "SVnE", "cMj#", "VCf3", "v3=g", "#YYW", "3wsZ", "hy8G", "@8hh", "?iJ%", "wZD%", "UMB9", "aNxX", "C9S?", "wDWF", "nBdE", "gTZy", "XzTZ", "Ca9j", "yzDW", "Nmcu", "%qaq", "o#JC", "NEP=", "Ctzu", "zRzv", "K2+M", "5Drg", "cZ?C", "WyXa", "a#A+", "Jt=D", "oJRh", "#!kz", "yCf7", "SCPG", "?6fx", "huNA", "qAtz", "b:xm", "u9K=", "7yKy", "Mzyt", "SUpP", "EazL", "9g+F", "2jYe", "Fn@K", "j%tt", "NJcx", ":S@U", "4:J2", "u8ce", "R8gh", "=pkM", "uDXV", "z6cR", "G@!U", "AmDu", "@aG%", "vVEL", "YS4b", "xVaD", "4ZM2", "yRen", "PSye", "sxu4", "@tgU", "vVw3", "S:oe", "a?8H", "o#yb", "7HNk", "bwie", "f4P:", "#wh:", "KV?L", "WFxb", "sz4D", "YcRt", "b6f7", "fN#V", "=FUf", "zFL:", "TyH7", "GP5=", "9fqC", "WriJ", "CfLk", "G2GX", "rKKw", "pSxR", "SJ+W", "5rj5", "NKd?", "bLNd", "PEqS", "#AeW", "5tgg", "=DAF", "rL+r", "tksC", "o7tX", "Mzx6", "mg@:", "zJcu", "e7YW", "suw2", "za@s", ":7:u", "?2K2", "h7HH", "hJeZ", "fPkF", "bb93", "u=5j", "::q3", "a3!P", "yuia", "#fDM", "8:UZ", "Donz", "=JVS", "4Yk!", "ueKD", "P?o6", "e8K@", "9Hzb", "t:!!", "Y3na", "HP4f", "SNME", "vYEr", "339:", "wZ=v", "vaJC", "CtMi", "3e:5", "kw?4", "D=jK", "7xPH", "RVNh", "=HFV", "Zmhb", "YoKu", "AZz9", "prDi", "2r7n", "PNCf", "RA2a", "B:zx", "P#DY", "U5ju", "MB+t", "MELL", "gR5R", "HH8X", "D:Gn", ":d!u", "hf3G", "u3w?", "tnPr", "pKL%", "yqtV", "Lfsk", "ykgA", "#BP=", "ADk@", "qne3", "kt4j", "XHbo", "eYLk", "MPK9", "aMgP", "mu8G", "iWpV", "+5h9", "2Auw", "RBS=", "ACC@", "Kxxs", "L9u=", "AwyH", "88Ba", "M:RZ", "pj5E", "YN3J", "eg5a", "Rc+d", "DUDr", "bpqY", "RLYi", "h8nX", "8sTq", "S@D4", "9N7K", "W7h3", "4nrS", "27im", "gps6", "Ti%B", ":khm", "rZdG", "@E7M", "dzXB", "c@K3", "mDq3", "TxwJ", "tZP@", "%xLR", "4E7R", "?P69", "yRRN", "+5:S", "AShB", "CRMF", "YX?h", "SHrE", "=ARw", "nsK4", "6Yqb", "s+B2", "!Ff=", "+9KE", "SDNp", "oh+c", "ah@u", "b@xU", "+eLh", "8TUX", "VPHW", "FF25", "LnE%", "S9nz", "gEuD", "+UFx", "GbYR", "FMYx", "6BrY", "vV9h", "2%sE", "FF9@", "vDSc", "PeF:", "=DfX", "SP5R", "JK2w", "JCP4", "n#3f", "v6h5", "owBd", "W?zH", "4DT9", "4n:A", "Kg6#", "UA4J", "nSop", ":TCD", "DYwq", "H#kv", "vjzk", "@%rw", "GNk:", "w#4w", "!Keq", "JanF", "qG6H", ":@Vs", "vEPP", "WB#a", "=hEL", "Uq9c", "2zmz", "XH5g", "r#!n", "TR@+", "kEN%", "+xjd", "iDmi", "6Yu8", "8R9h", "J2jP", "53Aj", "!3a7", "Rzhn", "jATq", "3g7q", "Nn3?", "tcRg", "vVRA", "8:UZ", "F+6G", "%TRE", "gUTT", "N38Y", "b8@f", "@mhv", "GSHv", "%Jo+", "ao!x", "aVpA", "vhu:", "Yj7H", "%6GV", "kNR+", "J?4L", "Fs78", "9hSN", "!9vd", "ZA??", "hpCH", "%yhA", "qrta", "J6tk", "VWiG", "#CxJ", "vuNc", "T@dL", "zc7y", "6Dmi", "Z4F@", "YSsP", "KVh5", "@Ac#", "Hkit", "ebGz", "8Egs", "kyT5", "6PMb", "D@Jo", "ndmB", "F6NR", "4!Br", ":xtd", "rc!U", "MSG@", "4w42", "b5nG", "%FY8", "Zthe", "tdXg", "U3Ft", "q!SX", "V9CL", "%y4R", "VgRf", "Av4V", "F!!r", "=8qA", "9azs", "SLPB", "??5J", "cm2y", "J+hj", "Szo5", "Jpj8", "dme8", "bu2E", "ew62", "ofjr", "L!ZN", "mXx+", "X82y", "qehH", "i8vg", "Nd=b", "WXc8", "5s6h", "i:KN", "tPJX", "X#G9", "+?Ut", "6bZU", "oz5T", "9pKN", "4XVc", "73Hd", "YSdM", "7agf", "qX8F", "e!Du", "6C6E", "zc9:", "s2u=", "7dKG", "madw", "3T@x", "97wS", "cGW5", "rywX", "jRUR", "amp=", "LX6d", "TYnK", "=V#v", "q8gU", "RfFk", "V#bU", "N4rp", "Dghb", "DWZX", "MWui", "C8hA", "%hKi", "BY#3", "RNLr", "HGaj", "cSb8", "cRBY", "H3BM", "%s9v", "DxhA", "ggPV", "=89=", "xHdb", "a:mP", "j=Mm", "2?zi", "RSnF", "iDmb", "qCY?", "a!hB", "PE3r", "keXc", "!Lb6", "E8JF", "%YBD", "7NgY", "zukU", "oR!j", "Uqpv", "2FkU", "Zt!n", "z!e6", "9BbK", "isJF", "zNVd", "ycjp", "#85#", "Z9Wv", "e:8b", "KEc3", "tp!9", "2zT?", "44A:", "6tNi", "k!hh", "PfG+", "2Jbp", "ebSb", "S!fw", "cVhW", "qBy2", "KDwb" };
			testKnownGood(offset, knownGood);
		}

		[Test]
		public void Passcodes72BitCounterValue()
		{
			//[UInt64.Max]*16 = 295147905179352825840
			BigInteger offset = BigInteger.Parse("295147905179352825840");
			string[] knownGood = { "vVJJ", "Ujoz", "HrTf", "jgBE", "f?=u", "94bL", "eB4c", "6Eh3", "R+n:", "ksXc", "yUg8", "R5Pr", "@94!", "WbxV", "%D9c", "5+xV", ":%K%", "wKtT", "KEGt", "oiAs", "?B5:", "vHJv", "s!=x", "#?2E", "4Tgc", "YwBd", "?R%9", "yx4+", "4Mzq", "Pc7J", "Y%eN", "#Z8j", "seJB", "4sma", "bd5K", "+PSc", "XfgG", "AEDF", "AaCA", "R66%", "i?bz", "tw9K", "BP84", "gZXh", "X+Cf", "byCv", "z6G4", "b:!R", "m3sy", "2aw@", "U2yG", "#463", "YAMA", "rGbb", "5LSq", "KkCD", "Jq?K", "sm7B", "NCqN", "zB8o", "+Pu6", "j#:X", "tNqi", "V%Vu", "V8WX", "NNhC", "Ae#s", "yW#p", "8@fk", "Umt8", "9exd", "rN+E", "tNEa", "w:Un", "ZMRF", "@3Ez", "v+Mf", "WjuW", "a!=o", "=7GZ", "9xpW", "#Xgc", "yoo+", "xeEB", "bY3K", "Z@?G", "EYZg", "Jzwd", "RVc=", "JqC+", "HR!%", "VKPe", "ubTs", "pGZi", "2oJx", "twFZ", "K3zG", "M5fg", "m=id", "3YmR", "u6jC", "fBya", "b=ft", "qA!S", "acYT", "kJ?D", "zR9H", "S6:h", "+7qu", "vMZB", "JHC!", "M@W%", "jRUx", "Cuk9", "eS9d", "G=mq", "u6nt", "VK+7", "b2Df", "ZYSp", "R3C+", "P9cW", "8KCA", "LycX", "hM3!", "PhXP", "V2bt", "ZWCy", ":#n9", "#%yi", "SwVY", "HHBx", "st#X", "cwd8", "J+xn", "wapr", "57f8", "F!nw", "cZn4", "CTvp", "9!rn", "eVT@", "fSss", "cPT=", "B?Wz", ":hni", "E8!F", "?BCd", "?4Ka", "DvK?", "5atL", "M2MV", "?r6b", "#4+d", "KifU", "+9nV", "C3Tx", "p79n", "ut4@", "%JWD", "2nXn", "jcq3", "d6Mt", "aDC3", "Ukf8", "#Ko+", "e5eS", "q5Kt", "vG26", "FG+c", "Xzfj", "ZuTC", "xe:M", "4SEY", "3BdY", "Wakx", "3pYY", "!LKf", "Cx2s", "g%dC", "c=aC", "?5#k", "skJ7", "PDMh", "SqJC", "qAJK", "Sdgr", "Bi8s", "3vJ@", "YsLh", "n+:C", "ihGX", "SunS", "Rs9w", "YHvp", "vyG%", "UZ4G", "HZX=", "MngM", "e8Ar", "UWhV", "BCfU", "LE#g", "8f=?", "3FNM", "2=3H", "3VGB", "V#jz", "ne@a", "b=Bp", "Wf7X", "wRF=", "T8NW", "fW2B", "6vpJ", "xe3+", "zFPf", "t%g9", "77G5", "X4#B", "oeZ?", "FBhD", "77RC", "2KTt", "p3U:", "YtH?", "=Y3!", "jAMg", "dnow", "n8HJ", "ggv3", "ta4u", "UAPn", "%xHi", "o3o2", "Hz+E", "%yPR", "qdoo", "pvJk", "zx%7", "E7EN", "V2a8", "p%=P", "JyEd", "Bhf6", "G+eq", "5C:T", "AWbt", "fcXD", "5GCg", "HHqL", "3XL2", "+!wD", "Lv4s", "sk=w", "%LTE", "3#ej", "JG7J", "9pq8", "vrFs", "+wS+", "ZCH3", ":vgq", "F#eR", "K:6a", "sTNR", "+pMM", "AovG", "FxUd", "ShB3", "Ls#K", "B9mH", "8J@q", "vv2p", "kS6T", "t!8A", "br7q", "P8c8", "b8bD", "oJ85", "fB3X", "JAc7", "HLvB", "sL4C", "6f=7", "U8SR", "Rs:f", "p2wA", "sVAa", ":9Cp", "PtB7", "MB=L", "?+ev", "zxbg", "?Tjb", "?jRy", "n+iz", "MfoM", "Dwwp", "aVp6", "67Ee", "UVrA", "879w", "mUBk", "tbZ!", "2gA6", "yF:n", "LM6c", "XD@G", "tHu@", "%4mg", "p:Pv", "LYT?", "r8Eo", "vr5U", "5=D6", "JVDg", "WMTE", "Wtyf", "h@94", "C3qc", "v@ZE", "Z2PN", "hC4C", "HNRw", "qc=s", "Va3i", "VSWt", "bZCa", "ZnrG", "@@x2", "jWJf", "T?33", "tD%p", "RhCT", "he8m", "duXW", "d:vn", "iyju", "fPRk", "XqdB", "S!wf", "omv5", "GHiG", "LXMz", "LgfB", "4byw", "LFj+", "oMUh", "=9FR", "YC3s", "+N33", "tnoH", "rmPh", "pxVF", "5ZdL", "wqAN", "ecf=", "ACWG", "2Cym", "xCUM", "As+W", "wN:X", "iFR9", "VZ%p", "qqjr", "yrCd", "7G9f", "w@Sd", "Hw=:", "xZYW", "ksH4", "spnb", "AZrV", "LktD", "bp%x", "g5D5", "ehue", "3D7E", "4k=m", "a3MJ", "GJFs", "FqCi", "LnLS", "fn4n", "!V=!", "BuE?", "c9Yq", "?7?4", "8MuR", "ACvW", "JGha", "VVqo", "uYWd", "C3+3", "YM=%", "TRBP", "fNTJ", "i=SF", "UT4+", "EjGs", "?+=R", "xYH3", "!y6H", "AHoR", "j8L#", "6?Jd", "UJ6q", "+JLr", "mATB", "p:x#", "q3az", "kAuv", "pPJ=", "26sU", "2qKm", "h726", "F65b", "KHpa", "DLpq", "XeJE", "v!R9", "JbkP", "9%bv", "iRu5", "kWCA", "r6Vw", "Yme:", "mqsa", "t7jD", "Ve:s", "yr5R", "ijq%", "X2nw", "=+Yy", "4%z6", "5sv:", "CRvw", "+x9d", "ZiLh", "d@V?", "DjM#", "7B4W", "%U%p", "XB7R", "6NHg", "Zb@i", "!aR:", "MHZF", "gGqP", "kLW:", "VzTG", "MZHc", "hiaT", "y7At", "6zi@", "wVyu", "3a%n", "EgXZ", "c5eC", "X@dy", "j#sT", "ZVn:", "Hi:b", "T@a=", "bwRj", "?fMg", "8Dq5", "7cEh", "ZFns", "Dm%r", "jcpC", "+xMx", "pJcw", "C4om", "gn3a", "zDn=", "@qaE", "5sW:", "Tk2=", "uP3K", "vG5B", "voML", "c7Xk", "Rhed", "3rSo", "5Cbf", "feTU", "vmv:", "=FnX", "VBKo", "kUq=", "mbBP", "6A:y", "FBsd", "i!?x", "6#7L", "Y@+V", "bea7", "RrRP", "RVfh", "h%?r", "m##F", "BRYC", "WBrg", "E@rE", "r7qF", "S?Cf", "Fa?S", "hHnb", "s%c=", "MdGD", "eb88", "eE4B", "Tt#r", "b3%F", "bD5j", "rXS3", "Xbr4", "NH9Z", "uhRU", "qrCv", "@Tqo", "Pw4F", "6J%c", "dT=9", "HT%e", "BJ5f", "izxc", "@o#a", "N2cw", "nkPr", "h5cL", "P+3J", "KNfq", "JM%=", "u3Wm", "gFkG", "r=6+", "NTDc", "qb@r", "wCfV", "Wva4", "M@v5", "3WhZ", "+M9a", "dakp", "3:%o", "F6M6", "Y@K%", "qyfW", "Bg6?", "qF3C", "j!FS", "G6KN", "7TLH", "Mpn=", "u!aN", "vRhD", "@8ZF", "S%Dm", "cdDx", "AunW", "=gk6", "KnUc", "sgw+", "!!CN", "Ctx4", "WquM", "MJ:t", "Jgye", "j2zn", "v?tD", "9E%D", "xKyc", "mA8p", "FS=v", "=JFy", "Gn:6", "66PJ", "?v9o", "@nDf", "#TNr", "ifnT", "Jbuw", "VSLy", "Hg!e", "wuNr", "qBrj", "SaHy", "U9Yu", "Jd92", "v78r", "sRvg", "JARB", "SDcS", "to!B", "Kj#f", "qsTK", "JXEW", "EWfp", "AW4!", "!4dr", "kX5d", "iz%%", "khmV", "fR6M", "yj58", "yoai", "Dedv", "qzaW", "h%%q", ":3eR", "%=Sn", "8Z33", ":EnD", "MBcG", "xigm", "Y%mM", ":y6a", "uKcW", ":+b%", "ZmE6", "E9XV", "6qZp", "+bH:", "cafj", "i@VN", "Z8Ww", "UeS9", "sA5h", "x=JL", "L7!+", "r?m+", "=2@M", "w?Re", "S6DC", "uLx7", "w4ii", "5aHp", "CNsD", "XyEu", "UAkt", "4C5U", "RPA=", "edAd", "3CLD", "faBz", "HL2E", "%45y", "nSDE", "Rbg!", "wobL", "kfw=", "qH:f", "EDBy", "+zpd", "!xf=", "+aiR", "8zLg", "soEK", "itnc", "tTHU", "?=Dj", "i!bb", "%M2s", "VspG", "f=DJ", "H92J", "#Sb?", "bqj7", "VC5b", "cX#7", "L2:7", "oF#g", "BvsV", "zuoS", "A#sm", "8ftk", "sY8c", "LXwn", "FhAF", "Y:%T", "cwBU", "oZam", "BpTS", "Vrjy", "u=E=", "GwcY", ":%Lo", "6eTp", "TYrR", "JdtN", "7+hi", "JgW4", "NvsD", "KtKx", "9djp", "sVj2", "WKN:", "mVgs", "oVZ8", "%cki", "dfsa", "vtBg", "+%7t", "UPXB", "DXUB", "mV7x", ":KF:", "#zg2", "aW9v", "uEpj", "FS:!", "cDzL", "=S42", "%bFr", ":=Rz", "Ewh8", "eius", "XBZg", "NMLK", "C9@z", "zbv?", "e9TW", "qYES", "zSkY", "77Fo", "kHRv", ":6Ux", "63UZ", "#suv", "sk#E", "p?Yb", "DcEw", "Aq79", "zpVq", "uive", "aE9T", "%YgT", "MNa2", "oxxp", "UrWe", "ZvCe", "MS2F", "kby=", "L?RC", "5ZT@", "n8@B", "D8HG", "9%Xk", "XUX?", "W@uV", "%iVH", "ET7D", "hYKB", "J=ah", "=HSR", "n!!y", "D:i?", "fF=R", "a@=Z", "sY%:", "eki?", "+i6r", "bMkT", "F=?t", "BukJ", "XUY+", "DKoJ", "BETC", "aBvc", "4e9c", "9@LD", "38kp", "Vx32", "SE8q", "mhD%", "39cR", "ynrg", "bAeG", "YH2c", "t4+C", "ovuj", "qhBm", "WWe7", "vaZL", "9uLc", "x#4%", "gw6X", "w4p@", "vpkn", "K%CJ", "+WF2", "255J", "f+Wz", "nEYM", "eYW@", "bW?v", "qdNP", "xgMZ", "i36k", "e?Ng", "a2qd", "42Pp", "jMKJ", "thTc", "9iyv", "q4ur", "6a6H", "zjtg", "X5t?", "iRRB", "pJ+#", "cfzP", "8hYN", "4PGm", "zh?N", "J8Wr", "GjTr", "@!YB", "7c3L", "rGX3", "rspx", "=t7v", "i7ra", "wEZo", "@C@W", ":6!E", "Zmnv", "LNE5", "kYhw", "XxoB", "oLR+", "oAf?", "YodJ", "m53g", "+jF7", "WG9Z", "o!ft", "tYf%", "RohX", "byoL", "TR=b", "?vbh", "DWC7", "f+MW", "MxTA", "ewNm", "@tq3", "DJp2", "e2EC", "Biy@", "hmWy", "Lt3M", "nUh@", "X6m8", "n!9a", "Sac4", "Wuzy", "yuk4", "kZCk", "v8TU", "jV2K", "P4dU", "=UzY", "ZzUP", "@%tF", "AT%7", "=4cH", "!2+7", "79SD", "#=Dj", "4Y!C", "q%M+", "p:Bt", "s4z8", "xff4", "t:ma", "PcH2", "2EMG", "qkmq", "ryym", "682V", "tPm8", "xFMf", "@d4q", "nNqZ", "bDsM", "9cvf", "8mb!", "#sJZ", "Hyxf", "mHF9", "YtoF", "49nu", "+PKH", "Nqcy", "d?s#", "?P:C", "?VnK", "mmJS", "7om9", "Uauc", "NEWN", "rbcz", "=Ltx", "%UpT", "#muE", "jmff", "Cpfb", "%?Ad", "VEYa", "n#EX", "!25+", "kWLK", "pL2%", "FYeZ", "i?rL", "W7=q", "+ggw", "JGJs", "835H", "dKf7", "m%wa", "eHhd", "#2YR", "pRL4", "Nfrj", "4E2t", "M?S@", "3oeq", "%sCj", "SJTu", "vdnG", "nHYJ", "T!7C", "6isY", "uTcx", "hyiZ", "hDtF", "etco", "vkG9", "2L37", "GEX?", "p7Zf", "!#5H", "Jszf", "H2q?", "58nD", "SHsV", "CjHL", "7mcT", "9LXo", "=FaX", "9v8z", "j?em", "ELEq", "89%G", "hpEo", "xbJ6", "UZGS", "Rwjq", "oUVf", "ZKbB", "3YRT", "vEGk", "MyqT", "YHgP", "gAqC", "Jy+W", "ZxwS", "tV@N", "2WGu", "uY4F", "xWyP", "yEoo", "5W9n", "6H2W", "5i+V", ":9=T", "z+7w", "DFVU", "TPMR", "LKC7", "Jd@:", "UUBX", "Z%jJ", "%R9+", "gMDp", "?H#A", "vs7C", "NW!q", "Xh#i", "?:Np", "B!NW", "w#XT", "yBt#", "yLZk", "%m6T", "gf#p", "Gp6j", "zUXz", "DJaT", "Y5?k", "MBnL", "mZXn", "MAhg", "K=pV", "CwRp", "S!UA", "dUZ8", "ZFKV", "H6Cv", "gx56", "iMX@", "vXaW", "?8eh", "%%od", "cx3b", "exx7", "hx:D", "Lkhv", "#BJ+" };
			testKnownGood(offset, knownGood);
		}

		[Test]
		public void Passcodes128BitCounterBoundry()
		{
			//Random 128 bit value aligned in 16 byte window = 310223320689562689054736980884896795312
			BigInteger offset = BigInteger.Parse("310223320689562689054736980884896795312");
			string[] knownGood = { "T%GA", "NbTx", "r4R2", "iHNK", "TgKJ", "xz=6", "gmiE", "f45c", "CqSL", "cpth", "RLfG", "uYEy", "c+=K", "G=a3", "57@2", "%Mge", "cVX8", "r8g3", "E:4i", "qpEd", "cCfW", "v9:u", "@MmS", "TDdr", "X%6v", "RF6V", "GWmf", "HUCr", "9sX%", "Ye+4", "4p6d", "EvYN", "WYp4", "jePG", "iXKp", "dBJT", "x#3X", "d3:U", ":nb4", "YWJ6", "2mFg", "gmNS", "V2hG", "fbBE", "JZYY", "3yPN", "Xfc:", "z%H2", "qUsU", "#d:2", "2kfi", "9KUE", "5=jE", "r6nW", "c:+6", "b5HE", "KVK5", "yoha", "xMK7", "P3CF", "jgc2", "hG77", "s5be", "Z3jf", "CLiJ", "siyE", "FXbe", "@XKn", "Jfaq", "TU9j", "q5o5", "Y3qM", "!:AP", "La7e", "?4f:", "f+rF", "44+F", "eqj5", "uBsd", "vGAb", "7?b:", "pnUo", "sYYS", "piwf", "q2d?", ":3+:", "6NEE", "2E+:", "rqC6", "qvgT", "mm64", ":eV3", "R2aC", "mxua", "85ZL", "UpGs", "W5:k", "jpH9", "vXzX", "C2JU", "Rc46", "ZTWg", "fJ#+", "6!@W", "vJ#e", "XFDc", "bNhD", "ma6D", "k@j!", "o6z+", "NRXx", "Fd32", "3Ajy", "jtcE", "4Jmp", "nbdb", "Yari", "wuDL", "=8kj", "L6i!", "T5e=", "FEbU", "Rf+y", "=9Jh", "idpj", "8CDA", "rECq", "c=D6", "88w2", "!mE2", "ch!M", "x=E4", "4Fn@", "kjj:", "ji6!", ":Uqj", "Vkvq", "#JXG", "NSjv", "xh@j", "tg5E", "#fek", "AN??", "+rBd", "xVRC", "o6S#", "GFz+", "JSfM", "F#EZ", "EXod", "EyX8", "+vtE", "wHWs", "q+%B", "q#Rw", "Y3%4", "Xg3p", "c%@L", "gJjJ", "gjgg", "Zt2W", "LSRm", "exHJ", "x7rM", "hD%v", "5ePy", "rzdi", "pCWm", "oXML", "=yTE", "pocX", "Y3BS", "KDj4", "9LmF", "Xvqt", "ZV5t", "DdjC", "3+L=", "VknS", "93Mn", "=?p9", "LjZP", "AqCT", "YWgD", "sog9", "W4uy", "K?ta", "YnCk", "n%Kq", "wkKo", "aAPV", "uATE", "?#qp", "Bh@X", "UFkZ", "Xq@#", "rFLb", "f#vp", "P7sk", "V2Dp", "ANMK", "TDRV", "6dMb", "GP9C", "N@U@", "84di", "X:ff", "AyRW", "Vk5c", "RRuA", "w2KW", "LJFj", "cFcH", "itXS", "qG%E", "dPvC", "Uzdj", "vr8R", "#5v#", "4wFz", "@sFm", "@dEt", "!AUj", "3j+o", "tPBh", "Aru?", "HdUy", "Sxqn", "5N4!", "kKE2", ":YK@", "E8z5", "Pv68", "5M?g", "MhAC", "iyxe", "X+M2", "B4hV", "mw#S", "2J2a", "zk5E", "Be3y", "k+Vt", "UcPq", "#nW5", "=?9X", "!@WK", "7oK4", "cJ=F", "RAiE", "V6Fk", "55pr", "kyB8", "o%VJ", "J:KN", "@L6b", "8##2", "aAP@", "7Ybm", "#?gA", "#6Uu", "v5kv", "=NCt", "=V5w", "N7zt", "T:x5", "BpzY", "XXmP", "5Kc@", "UT+7", "8uKx", "2C%K", "cSbD", "CEs=", "hYxp", "MzA@", "xYvE", "KaeP", "SrR=", "o@KE", "Btqm", "TY!w", "JWcu", "gzBx", "hYkF", "SA@A", "XrDa", "NA4#", "rkJt", "5Rtf", "xqpz", "Kho6", "qryb", "No3K", "@orq", "F?:P", "94R6", "sL=f", "Ef26", "zdRU", "!#Ji", "TK96", "vqvH", "YLNR", "PhM3", "6#+y", "8b@P", "x4S+", "f+RR", "D+K=", "oLbn", "fWWz", "naJP", "eNky", "WVb!", "dzne", "jTjv", "j3GS", "yHA:", "wkXf", "LmnF", "Em8o", ":4LM", "yuJ3", "dcvP", "NHKZ", "bNXc", "mmYy", "N%AT", ":t9+", "TcP4", "?79k", "jim:", "hm44", "YF#S", "gfhn", "vv@+", "n7q6", "=WdT", "JpfN", "JtRo", "hgD8", "mxVo", "5de?", "vT?%", "zoE%", "XcdV", "PBtY", "V2?3", "=hKk", "eYfP", "C97:", "=ART", "ttzg", "CLAb", "AX=?", "7bUW", "inuT", "paE#", "n7+n", "#Jth", "YwUw", "o5xz", "nyn7", "Hs6T", "xYTL", "ciUy", "+#9%", "gTPs", "Mf7N", "d7YN", "SuZb", "fhpX", "zaqn", "oZb#", "YKEs", "U2Xv", "Ga!4", "ZF8B", "fEqX", "obRx", "wSrP", "2kXi", "!zzy", "e7B2", "eqGN", "CKWr", "5Nvs", "DKcF", "!2pW", "Hp8x", "auLr", "#hef", "f%Y7", "9%57", "AgC5", "sZTw", "7xFs", "vWPa", "BEK8", "TL6A", "!gpi", "F@f3", "V?p=", "oTrA", "d+x@", "Kkgp", "bjLM", "P9ag", "7jLk", "U5H6", "eth5", "n6uh", "CBAM", "V7Yu", "2B32", "e:Nv", "oya+", "REGR", "kNvd", "qFoo", "2c7=", "t%J+", "ZE9A", "pW?F", "ypYu", "#Efr", "3+Xe", "bqbV", "#zWa", "=eFo", "W%JV", "RZ5B", "vZ2G", ":=Dy", "YaDj", "LRrD", "9Exi", "iHwj", "wXbo", "ys7W", "W#Dr", "huUU", "F8Y@", "!3#G", ":UPU", "VZdv", "dMqR", "YSyd", "xHRz", "=amB", "N?!+", "?LE7", "7!M=", "X8uZ", "D6Ad", "KyK#", "TzzB", "M4tw", "mTdc", "=xXu", "gVmp", "S@F?", "z+=@", "GSPz", "5#vu", "jPsd", "WuB+", "eV33", "!v88", "#9vt", "yA2U", "faXo", "RxCE", "Du!E", "YwxG", "wLVK", "Crn=", "LPGd", "nu3j", "oPU9", "wZSY", "i5Z6", "#TmD", "vJ3d", "s@s:", "as?L", "rsLJ", "Bz9e", ":5o:", "Y!56", "%rwW", "=mmn", "w6Kb", "gHVo", "mMFJ", "Z#vD", "VW3T", "qFf2", "JBKK", "8%#c", "43in", "tBZp", "%2kn", "REJ+", "6yN7", "4ht+", "NsFZ", "gPdC", "k!tt", "dXK!", "zDf!", "CTRk", "jCpZ", "7+NK", "ks8+", "v@Fv", "FD4m", "C6y%", "D6aa", ":i7j", "jigc", "g6ti", "9LX3", "v49T", "xDcU", "i6+:", "+DEN", "C+vs", "=!Y8", "cNDg", "Bn%#", "z?22", "RZrb", "opbE", "!c6n", "9WxH", "nDFJ", "fwnT", "r45d", "NBL8", "n?Gh", "@STY", "ATaF", "c3nC", "iywz", "q=YK", "3bmd", "Vb+r", "UBG!", "EK7x", "Vw8a", "@=j7", "2kHv", "hBG#", "U@!a", "EKAD", ":=C:", "=H9D", "GpoL", ":ri2", "wLcU", "=sU5", "JN23", "S9z:", "d6Yo", "5cxn", "Zz4f", "M#AA", "g!Np", "no#k", "o5By", "?pwy", "PRX=", "Ah4j", "z5Bs", "G5eb", "Zmji", "b9si", "cb9@", "pMu=", "zMm=", "v!42", "!m9+", "VN4b", "iBGd", "7A%e", "=%de", "xzvT", "E8aA", "4Bz3", "Zx#j", "cMWN", "ZncA", "?u?C", "yhmE", "paEa", "%9VG", "tyXR", ":=oJ", "hqfp", "r%qp", "F=!K", "jyyP", "P4Pc", "zgXn", "ajxn", "KXh8", "4T3r", "tUb@", "W%KX", "9+3u", "CyVU", "3:76", "4w=n", "fS4X", "KtD!", "5Afx", "6ox5", "cYEr", "+FEA", "aNtb", "amjg", "afEG", "8@jF", "3bZJ", "fru9", "rNLA", "8sTp", "6!7e", "9bLt", "d:Se", "2P+D", "UHxt", "D:xq", "TqRR", ":crr", "Y4ba", "eo7o", "zrVR", "CMMA", "@+sY", "LA!L", "oEZ2", "5o7L", "H2pp", "9y+J", "%Smc", "ZvRq", "Aq!j", "Y#bo", "kbcB", "Pc9n", "JK+A", "DP!5", "HSzj", "Z%PZ", "oitD", "gq83", "UfRV", "vM+q", "=NN=", "tg2?", "Yxv?", "Fr9X", "kGq?", "eVri", "HLmt", "x7az", "k6V%", "4#55", "5+hv", "usUb", "xZ7P", "=JHu", "jS+j", "U:CX", "wpH2", "edFo", "wkgt", "DLrS", "8yVz", "LRM5", "Cs?D", "!xKf", "vTtY", "LYym", "WLi:", "3doU", "rbU6", "qv?w", "mP8v", "xTrA", "uT+f", "SZRy", "!7Dn", "wRt5", "7up8", "#z9+", "Vu4B", ":%9d", "L%SR", "6n:y", "235n", "NnB@", "!wFH", "PU!7", "Eacx", "2G4b", "Jc6P", "CdHf", "Hjoj", "ADNP", "2HB!", "9Nup", "4AMM", "WhnP", "yPJq", "5!z3", "kASb", "3tno", "gu3?", "zR24", "4CUP", "4YzX", "n8hA", "XSRL", "?Wqm", ":xG=", "s2c@", "p5ys", "V2yd", "PytB", "%!o?", "wqFo", "ex99", "b9AM", "RCjY", "LZCt", "rTm=", "tifZ", "UTXS", "foZn", "ndWL", "mBiz", ":7yL", "kNzz", "km83", "M7bw", "vPB=", "4iZX", "S:63", "7PnL", "y4W5", "Ud:o", "x?!v", "5zh+", "MYqv", "?Ayb", "h?9t", "cu5y", "dN9t", "d:q#", "dPLa", "mNGz", "Kn+Z", "Us@T", "yvS6", "evb+", "DbB%", "DTMU", "#3##", "KgEP", "d?9c", "MRki", "sK8J", "wVh4", "2Fwz", "ADWi", "P3rC", "+rkx", "BHNW", ":ErY", "yNGm", "anm:", "9@B#", ":vzg", "ZEqd", "59rk", "T5v#", "TfUa", "aJzP", "5C7+", "yHbq", "RMg9", "A6Cs", "2b5J", "iAXt", "YKL7", "eraj", "eVsE", "e#mc", "ZC:v", "SCxG", "bob#", "Wc23", "ZZn:", "a3yV", "PW@t", "W?!p", "B:rt", "5adk", "nkuF", "Aj5N", "gtrX", "oLYr", "y4vm", "nsJL", "td:k", "nctE", "6bbE", "wimk", "AJ4x", "!?LW", "fLoe", "!mYt", "ABZf", "DYY:", "nV=u", "VUNo", "N%ce", "yn=E", "bj8Y", "@7fS", "7JYW", "??km", "JUKC", "+pp@", "wP!7", "ZCEG", "uYUn", "yjs6", "HhN#", "C@f#", "su6R", "avz:", "qz5?", "Lq4K", "K9#R", "AEGb", "W@fg", "=mCW", "vC4?", "i%2d", "2?KN", "CR7f", "p!+z", "6yUc", "xxgn", "hWb!", "!Z%S", "Enz!", "nikD", "jWY#", "#3Bv", "HyBW", "Kcnz", "p3ww", "Z%yT", "@V!C", "Sw++", "4V:X", "7N+a", "YWgM", ":NK6", "NgYu", "bo#e", "CMfA", "Xvvv", "svCA", "Jp!!", "ejVM", "a4#z", "2oPW", "8xZZ", "SjHk", "K#pp", "Gpvs", "6xx+", "!4sp", "AY4G", "7x6!", "6pM2", "8RwD", "ecF5", "3FXn", "b#UF", "iyTg", "KMxd", "aU33", "=W?v", "aZz=", "4jWi", "onk9", "s6bv", "bS2L", "NFm6", "bMxc", "Exxg", "o7me", "X#!@", "=C?e", "y@FL", "K3HA", "%GBa", "WjPA", "!mT=", "2zw#", "F4=K", "gc:g", "CAyT", "MS6#", "5C:H", "iHdv", "3Fk?", "WVGw", "!7Nd", "bZ7e", "iqXA", "Nq%j", "rGAG", "M67o", "Vc5@", "9Eoo", "W6DT", "MeN?", "NShR", "XFWf", "3Nqm", "N=pd", "xMLS", "t9#v", "2EXv", "ZMco", "LE?:", "bFPg", "4y#3", "ReaP", "rKeG", "A7Y2", "kfcy", "atNR", "D@xG", "4G59", "K#cN", "%kwZ", "GHzA", "fcK6", "6NRT", "oYtH", "ZnY5", "%cmg", "EaY5", "65eg", "uq%5", "Ss7m", "CY:C", "DR!p", "Dcq@", "iapY", "Ezco", "a+iB", "kYhS", "Gqne", "AirA", "MP@U", "zBba", "Rwha", "+?KT", "@jWW", "oGAP", "vj2V", "??M9", "YR5p", "=3zA", "+x9#", "3?wg", "?Js4", "+Xik", "WkBt", "MjPM", "4R3T", "rKx7", "pDaP", "3xnU", "5uRG", "9sxP", "7g3M", "FXae", "TNoq", "Bmzc", "JYs=", "Bnru", "CJ2Z", "jCzW", "7#Wd", "+q@c", "qdVt", "9yj9", "ZpwJ", "CJdM", "+TVa", "g+aM", "f45b", "KTSw", "##Bk", "zWJS", "NGxM", "k3m2", "86:F", "j8eN", "9#sB", "X8JS", "!XjH" };
			testKnownGood(offset, knownGood);
		}

		[Test]
		public void NewSequenceKeyIsCorrectLength()
		{
			string hexKey = PppGenerator.GenerateNewHexSequenceKey();
			Assert.AreEqual(64, hexKey.Length, "New hex key was not 64 hex bytes (32 bytes, 128 bits) long!");
		}

		[Test]
		[ExpectedException(typeof(ArgumentOutOfRangeException))]
		public void ThrowsOnInvalidSequenceKey()
		{
			ppp.SequenceKey = new byte[31];
		}
	}
}
